package PLCSymbolAndScope.PLCSymbolTables;

import PLCSymbolAndScope.IDGenerator;
import PLCSymbolAndScope.PLCScope.PLCScope;
import PLCSymbolAndScope.PLCSymbols.PLCClassDeclSymbol;
import PLCSymbolAndScope.PLCSymbols.PLCISTypeDeclType;
import PLCSymbolAndScope.PLCSymbols.PLCSymbol;
import PLCSymbolAndScope.PLCSymbols.PLCTypeDeclSymbol;

import java.util.HashMap;

//原subtable
public class PLCSymbolTable {

    //符号表的ID,在构造方法中初始化
    private int tableId;

    //引入此表的符号对象，在入栈时设置
    private PLCISTypeDeclType srcSymbol;

    //符号表所属作用域 -- 对应作用域,在入栈时设置
    private PLCScope tableScope;

    //该表下所有符号（按名称存储）,调用方法填充,
    public HashMap<String, PLCSymbol> symbolNameHashMap = new HashMap<>();

    //该表下所有符号（按ID存储）,调用方法填充
    public HashMap<Integer, PLCSymbol> symbolIDHashMap = new HashMap<>();

    //默认构造方法
    public PLCSymbolTable(){
        //设置符号表ID
        this.tableId = IDGenerator.newTableId();
    }

    //在此符号表下搜索符号,不应当在visit中调用
    public PLCSymbol findSymbol(String name){
        return this.symbolNameHashMap.get(name);
    }

    //向符号表的哈希表内添加符号, 一次添加两个
    public void addSymbol(PLCSymbol symbol, int symbolId, String symbolName){
        this.symbolIDHashMap.put(symbolId, symbol);
        this.symbolNameHashMap.put(symbolName, symbol);
    }

    public void addSymbol(PLCSymbol plcSymbol){
        this.symbolNameHashMap.put(plcSymbol.name, plcSymbol);
        this.symbolIDHashMap.put(plcSymbol.getSymbolId(), plcSymbol);
    }




    //-------------------------------以下为get set方法---------------------------------
    //引入此表的符号对象的set get方法
    public void setSrcSymbol(PLCISTypeDeclType srcSymbol) {
        this.srcSymbol = srcSymbol;
    }

    public PLCISTypeDeclType getSrcSymbol() {
        return srcSymbol;
    }

    //对应作用域的get set方法
    public void setTableScope(PLCScope tableScope) {
        this.tableScope = tableScope;
    }

    public PLCScope getTableScope() {
        return tableScope;
    }

    //tableId的get set方法

    public void setTableId(int tableId) {
        this.tableId = tableId;
    }

    public int getTableId() {
        return tableId;
    }

}
